{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "# Machine Learning for Design"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "## Notebook for Session01: A Gentle Introduction to Machine Learning"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Populating the interactive namespace from numpy and matplotlib\n"
     ]
    }
   ],
   "source": [
    "%pylab inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "Import scikit-learn, numpy and pyplot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "import sklearn as sk\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "Load Iris dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(150, 4) (150,)\n",
      "[ 5.1  3.5  1.4  0.2] 0\n"
     ]
    }
   ],
   "source": [
    "from sklearn import datasets\n",
    "iris = datasets.load_iris()\n",
    "X_iris, y_iris = iris.data, iris.target\n",
    "print X_iris.shape, y_iris.shape\n",
    "print X_iris[0], y_iris[0]\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "Create training and testing partitions and standarize data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(112, 2) (112,)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/lymanzhang/anaconda/lib/python2.7/site-packages/sklearn/cross_validation.py:44: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n",
      "  \"This module will be removed in 0.20.\", DeprecationWarning)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.cross_validation import train_test_split\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "# Get dataset with only the first two attributes\n",
    "X, y = X_iris[:,:2], y_iris\n",
    "# Split the dataset into a trainig and a testing set\n",
    "# Test set will be the 25% taken randomly\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=33)\n",
    "print X_train.shape, y_train.shape\n",
    "# Standarize the features\n",
    "scaler = StandardScaler().fit(X_train)\n",
    "X_train = scaler.transform(X_train)\n",
    "\n",
    "X_test = scaler.transform(X_test)\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "Plot the training data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.text.Text at 0x114e4f990>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nr1TYbTEAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x114e20250>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "colors = ['red', 'greenyellow', 'blue']\n",
    "for i in arange(len(colors)):\n",
    "    px = X_train[:, 0][y_train == i]\n",
    "    py = X_train[:, 1][y_train == i]\n",
    "    plt.scatter(px, py, c=colors[i])\n",
    "\n",
    "plt.legend(iris.target_names)\n",
    "plt.xlabel('Sepal length')\n",
    "plt.ylabel('Sepal width')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "Fit a Linear Classification method."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[-33.03434091  21.85204673]\n",
      " [ -2.98134261 -13.5666809 ]\n",
      " [ 16.39738437  -5.42667236]]\n",
      "[-19.0725077   -2.30328968  -4.60555075]\n"
     ]
    }
   ],
   "source": [
    "# create the linear model classifier\n",
    "from sklearn.linear_model import SGDClassifier\n",
    "clf = SGDClassifier()\n",
    "# fit (train) the classifier\n",
    "clf.fit(X_train, y_train)\n",
    "# print learned coeficients\n",
    "print clf.coef_\n",
    "print clf.intercept_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "Plot the three decision curves. Note that Class 0 is linearly separable, while Class 1 and Class 2 are not"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/lymanzhang/anaconda/lib/python2.7/site-packages/matplotlib/pyplot.py:3316: MatplotlibDeprecationWarning: The 'hold' keyword argument is deprecated since 2.0.\n",
      "  mplDeprecation)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nwQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1154433d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_min, x_max = X_train[:, 0].min() - .5, X_train[:, 0].max() + .5\n",
    "y_min, y_max = X_train[:, 1].min() - .5, X_train[:, 1].max() + .5\n",
    "xs = np.arange(x_min,x_max,0.5)\n",
    "fig, axes = plt.subplots(1,3)\n",
    "fig.set_size_inches(10,6)\n",
    "for i in [0,1,2]:\n",
    "    axes[i].set_aspect('equal')\n",
    "    axes[i].set_title('Class ' + str(i) + ' versus the rest')\n",
    "    axes[i].set_xlabel('Sepal length')\n",
    "    axes[i].set_ylabel('Sepal width')\n",
    "    axes[i].set_xlim(x_min, x_max)\n",
    "    axes[i].set_ylim(y_min, y_max)\n",
    "    sca(axes[i])\n",
    "    for j in arange(len(colors)):\n",
    "        px = X_train[:, 0][y_train == j]\n",
    "        py = X_train[:, 1][y_train == j]\n",
    "        plt.scatter(px, py, c=colors[j])\n",
    "    ys = (-clf.intercept_[i]-xs*clf.coef_[i,0])/clf.coef_[i,1]\n",
    "    plt.plot(xs,ys,hold=True)\n",
    "    \n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "Evaluate a particular instance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0]\n",
      "[[ 24.59759981   0.17072694 -25.77047581]]\n"
     ]
    }
   ],
   "source": [
    "\n",
    "print clf.predict(scaler.transform([[4.7, 3.1]]))\n",
    "print clf.decision_function(scaler.transform([[4.7, 3.1]]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "Measure accuracy on the training set"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.848214285714\n"
     ]
    }
   ],
   "source": [
    "from sklearn import metrics\n",
    "y_train_pred = clf.predict(X_train)\n",
    "print metrics.accuracy_score(y_train, y_train_pred)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "Measure  accuracy on the testing set"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.657894736842\n"
     ]
    }
   ],
   "source": [
    "y_pred = clf.predict(X_test)\n",
    "print metrics.accuracy_score(y_test, y_pred)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "Evaluate results using Precision, Recall and F-score, and show the confusion matrix"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "             precision    recall  f1-score   support\n",
      "\n",
      "     setosa       1.00      1.00      1.00         8\n",
      " versicolor       0.38      0.27      0.32        11\n",
      "  virginica       0.64      0.74      0.68        19\n",
      "\n",
      "avg / total       0.64      0.66      0.64        38\n",
      "\n",
      "[[ 8  0  0]\n",
      " [ 0  3  8]\n",
      " [ 0  5 14]]\n"
     ]
    }
   ],
   "source": [
    "print metrics.classification_report(y_test, y_pred, target_names=iris.target_names)\n",
    "print metrics.confusion_matrix(y_test, y_pred)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "Create a new classifier: a pipeline of the standarizer and the linear model. Measure the cross-validation accuracy."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 0.63333333  0.73333333  0.6         0.86666667  0.83333333]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.cross_validation import cross_val_score, KFold\n",
    "from sklearn.pipeline import Pipeline\n",
    "\n",
    "# create a composite estimator made by a pipeline of the standarization and the linear model\n",
    "clf = Pipeline([\n",
    "        ('scaler', StandardScaler()),\n",
    "        ('linear_model', SGDClassifier())\n",
    "])\n",
    "# create a k-fold croos validation iterator of k=5 folds\n",
    "cv = KFold(X.shape[0], 5, shuffle=True, random_state=33)\n",
    "# by default the score used is the one returned by score method of the estimator (accuracy)\n",
    "scores = cross_val_score(clf, X, y, cv=cv)\n",
    "print scores\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "Calculate the mean and standard error of cross-validation accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Mean score: 0.733 (+/-0.053)\n"
     ]
    }
   ],
   "source": [
    "from scipy.stats import sem\n",
    "\n",
    "def mean_score(scores):\n",
    "    \"\"\"Print the empirical mean score and standard error of the mean.\"\"\"\n",
    "    return (\"Mean score: {0:.3f} (+/-{1:.3f})\").format(\n",
    "        np.mean(scores), sem(scores))\n",
    "\n",
    "print mean_score(scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
